home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d20 / pvert.arc / PKT2QWK.C < prev    next >
C/C++ Source or Header  |  1992-01-15  |  11KB  |  415 lines

  1. #ifdef OS2
  2.  #define INCL_DOS
  3.  #include <os2.h>
  4. #endif
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <time.h>
  9. #include <sys/types.h>
  10. #include <sys/stat.h>
  11. #include <errno.h>
  12. #include "qwk.h"
  13. #include "xqwk.h"
  14. #include "xmsg.h"
  15. #include "bmg.h"
  16. #include "pkt.h"
  17.  
  18. extern char * lstrip (char *);
  19. extern char * rstrip (char *);
  20. extern char * stripcr (char *);
  21. extern char * stristr (char *t, char *s);
  22. extern char * assign (char *s,char *p);
  23.  
  24. int get_msg (FILE *fp,unsigned int buflen,char *buff,char **text,XMSG *xmsg);
  25.  
  26. char *area = NULL;
  27.  
  28.  
  29.  
  30. int main (int argc,char *argv[]) {
  31.  
  32.     XMSG msg;
  33.     char *p,s[QWKBLKSIZE + 1],*hold,bbsid[9] = "",pktname[13],*lastarea = NULL;
  34.     FILE *pkt,*qwk;
  35.     int  c,uselist = 0,isrep = 0,numareas = 1;
  36.     long nummsgs = 0L,secs;
  37.     QWKAREAS *head = NULL,*info,*last = NULL;
  38.     QWKAREAS *ahead = NULL,*ainfo,*alast = NULL;
  39.     struct stat st;
  40.     PKTHDR pkthdr;
  41.     time_t start;
  42.  
  43.  
  44.     printf("\n                      P-VERT"
  45.            "\nPKT2QWK; converts Fidonet type 2 packets to QWK packets.\n");
  46.  
  47.     start = time(NULL);
  48.  
  49.     if(argc < 2) {
  50.         printf("\nUsage: PKT2QWK <rootpktname> [-R(replypkt)] [-T(able)]\n");
  51.         return 1;
  52.     }
  53.  
  54.     strncpy(pktname,argv[1],8);
  55.     pktname[8] = 0;
  56.     rstrip(lstrip(pktname));
  57.     p = strchr(pktname,'.');
  58.     if(p) *p = 0;
  59.     if(!*pktname) {
  60.         printf("\nError in <rootpacketname>\n");
  61.         return 2;
  62.     }
  63.  
  64.     for(c = 2;c < argc;c++) {
  65.         p = argv[c];
  66.         while(*p == '/' || *p == '-') p++;
  67.         switch(toupper(*p)) {
  68.             case 'R':   isrep = 1;
  69.                         break;
  70.  
  71.             case 'T':   uselist = 1;
  72.                         break;
  73.  
  74.             default:    printf("\nUnknown option \"%c\"\n",*p);
  75.                         break;
  76.         }
  77.     }
  78.  
  79.     /* read in table */
  80.  
  81.     if(uselist) {
  82.         sprintf(s,"%s.TBL",pktname);
  83.         qwk = fopen(s,"rt");
  84.         if(!qwk) {
  85.             printf("\nCan't find table %s\n",s);
  86.             return 3;
  87.         }
  88.         printf("\nReading table %s\n",s);
  89.         while(!feof(qwk)) {
  90.             if(!fgets(s,80,qwk)) break;
  91.             stripcr(s);
  92.             if(!*s) continue;
  93.  
  94.             info = malloc(sizeof(QWKAREAS));
  95.             if(!info) break;
  96.  
  97.             info->confnum = atoi(s);
  98.             p = strchr(s,',');
  99.             if(!p) {
  100.                 free(info);
  101.                 continue;
  102.             }
  103.             p++;
  104.             info->name = strdup(p);
  105.             if(!info->name) {
  106.                 free(info);
  107.                 continue;
  108.             }
  109.  
  110.             if(!head) head = info;
  111.             if(last) last->next = info;
  112.             info->prev = last;
  113.             info->next = NULL;
  114.             last = info;
  115.         }
  116.  
  117.         if(!head) {
  118.             printf("\nDidn't get anything out of the table\n");
  119.             return 4;
  120.         }
  121.     }
  122.  
  123.     hold = malloc(65202U);
  124.     if(!hold) {
  125.         printf("\nNot enough memory\n");
  126.         return 5;
  127.     }
  128.  
  129.     sprintf(s,"%s.PKT",pktname);
  130.     pkt = fopen(s,"rb");
  131.     if(!pkt) {
  132.         printf("\nCan't open packet %s\n",s);
  133.         return 6;
  134.     }
  135.     fread(&pkthdr,sizeof(PKTHDR),1,pkt);
  136.  
  137.     if(!isrep) strcpy(s,"MESSAGES.DAT");
  138.     else sprintf(s,"%s.MSG",pktname);
  139.  
  140.     qwk = fopen(s,"wb");
  141.     if(!qwk) {
  142.         fclose(pkt);
  143.         printf("\nCan't open QWK packet %s\n",s);
  144.         return 7;
  145.     }
  146.  
  147.     if(!qwkwriteblk(qwk,"Not produced by Qmail, no Copyright (c) 1987 and No Rights Reserved.")) {
  148.         fclose(pkt);
  149.         fclose(qwk);
  150.         printf("\nCan't write to QWK packet %s\n",s);
  151.         unlink(s);
  152.         return 8;
  153.     }
  154.  
  155.     while(!feof(pkt)) {
  156. #ifdef OS2
  157.         DosSleep(0L);
  158. #endif
  159.         c = get_msg(pkt,65200U,hold,&p,&msg);
  160.         switch(c) {
  161.             case -1:    printf("\nPacket read error\n");
  162.                         goto BreakOut;
  163.  
  164.             case -2:    goto BreakOut;  /* end of packet */
  165.  
  166.             case -4:    printf("\nFatally grunged packet\n");
  167.                         goto BreakOut;
  168.  
  169.             case 0:     break;
  170.  
  171.             default:    continue;
  172.         }
  173.  
  174.         if(!msg.length || !*p) continue;
  175.         if(!area) {
  176.             if(head) area = head->name;
  177.             else area = "NETMAIL";
  178.         }
  179.  
  180.         /* find or make conference number */
  181.  
  182.         if(head) {
  183.             info = head;
  184.             while(info) {
  185.                 if(!stricmp(area,info->name)) break;
  186.                 info = info->next;
  187.             }
  188.             if(!info) {
  189.                 printf("\n? Unknown area %s skipped\n",area);
  190.                 if(lastarea) free(lastarea);
  191.                 lastarea = NULL;
  192.                 continue;
  193.             }
  194.             c = xwriteqwkmsg(qwk,NULL,&msg,p,nummsgs + 1,info->confnum,isrep);
  195.         }
  196.         else {
  197.             ainfo = ahead;
  198.             while(ainfo) {
  199.                 if(!stricmp(area,ainfo->name)) break;
  200.                 ainfo = ainfo->next;
  201.             }
  202.             if(!ainfo) {
  203.                 if(lastarea) free(lastarea);
  204.                 lastarea = NULL;
  205.                 ainfo = malloc(sizeof(QWKAREAS));
  206.                 if(!ainfo) continue;
  207.                 ainfo->name = strdup(area);
  208.                 if(!ainfo) {
  209.                     free(ainfo);
  210.                     continue;
  211.                 }
  212.                 ainfo->confnum = numareas++;
  213.  
  214.                 if(!ahead) ahead = ainfo;
  215.                 if(alast) alast->next = ainfo;
  216.                 ainfo->next = NULL;
  217.                 ainfo->prev = alast;
  218.                 alast = ainfo;
  219.             }
  220.  
  221.             c = xwriteqwkmsg(qwk,NULL,&msg,p,nummsgs + 1,ainfo->confnum,isrep);
  222.         }
  223.  
  224.         if(c != MSG_NOERR) {
  225.             printf("\nQWK packet write error #%d errno = %d; aborting...\n",c,errno);
  226.             fclose(pkt);
  227.             fclose(qwk);
  228.             free(hold);
  229.             return 9;
  230.         }
  231.  
  232.         if(!lastarea || stricmp(lastarea,area)) {
  233.             printf("\n%s ",area);
  234.             lastarea = assign(lastarea,area);
  235.         }
  236.         printf("%-09ld\b\b\b\b\b\b\b\b\b",++nummsgs);
  237.     }
  238.  
  239. BreakOut:
  240.  
  241.     fclose(pkt);
  242.     fclose(qwk);
  243.     free(hold);
  244.     if(lastarea) free(lastarea);
  245.     qwkfreeareas(head);
  246.     qwkfreeareas(ahead);
  247.  
  248.     printf("\nCleaning up\n");
  249.     if(nummsgs) {
  250.         sprintf(s,"%s.PKT",pktname);
  251.         unlink(s);
  252.     }
  253.     else {
  254.         if(!isrep) strcpy(s,"MESSAGES.DAT");
  255.         else sprintf(s,"%s.MSG",pktname);
  256.         unlink(s);
  257.     }
  258.  
  259.     printf("Complete: processed %ld message%s\n",nummsgs,&"s"[nummsgs == 1L]);
  260. }
  261.  
  262.  
  263.  
  264. int get_msg (FILE *fp,unsigned int buflen,char *buff,char **text,XMSG *xmsg) {
  265.  
  266.     char *p,*endptr,*tempo,wasmsgid = 0,*origin,*pathline,*seenby;
  267.     long pos;
  268.     unsigned int x,len,*temp,chk,first_grunged = 0;
  269.  
  270.  
  271. Again:
  272.  
  273.     area = NULL;
  274.     memset(xmsg,0,sizeof(XMSG));
  275.     if(feof(fp)) return -2;
  276.     pos = ftell(fp);
  277.     chk = fread(buff,1,buflen,fp);
  278.     if(!chk || chk == 65535U) return -1;
  279.     buff[buflen] = 0;
  280.     p = buff;
  281.     if(*p != (char)'\02' || p[1] != (char)'\0') {
  282.         if(feof(fp) || (*p == (char)'\0' && p[1] == (char)'\0')) return -2;
  283.         if(p < buff + buflen) p++;
  284.         pos++;
  285.         while(*p != (char)'\02' && p < (buff + buflen)) {
  286.             p++;
  287.             pos++;
  288.         }
  289.         fseek(fp,pos,SEEK_SET);
  290.         if(!first_grunged) {
  291.             printf("\nHmph.  Grunged packet...trying again...\n");
  292.             first_grunged++;
  293.             if(first_grunged > 1024) {
  294.                 return -4;
  295.             }
  296.         }
  297.         goto Again;
  298.     }
  299.     p += 2;
  300.     temp = (unsigned int *)p;
  301.     xmsg->orig = *temp;
  302.     p += 2;
  303.     temp = (unsigned int *)p;
  304.     xmsg->dest = *temp;
  305.     p += 2;
  306.     temp = (unsigned int *)p;
  307.     xmsg->orig_net = *temp;
  308.     p += 2;
  309.     temp = (unsigned int *)p;
  310.     xmsg->dest_net = *temp;
  311.     p += 2;
  312.     temp = (unsigned int *)p;
  313.     xmsg->attr = *temp;
  314.     p += 2;
  315.     xmsg->cost = 0;
  316.     p += 2;
  317.     strncpy(xmsg->date,p,20);
  318.     xmsg->date[19] = 0;
  319.     while(*p) p++;   /* <--This kludge thanks to QMail, the broken wonder */
  320.     p++;
  321.     strncpy(xmsg->to,p,36);
  322.     xmsg->to[35] = 0;
  323.     while(*p) p++;
  324.     p++;
  325.     strncpy(xmsg->from,p,36);
  326.     xmsg->from[35] = 0;
  327.     while(*p) p++;
  328.     p++;
  329.     strncpy(xmsg->subj,p,60);
  330.     xmsg->subj[59] = 0;
  331.     while(*p) p++;
  332.     p++;
  333.     *text = p;
  334.     while(*p) p++;
  335.     p++;                            /* Should be start of next msg */
  336.     endptr = p;
  337.     pos += (long)(endptr - buff);
  338.     fseek(fp,pos,SEEK_SET);         /* Now positioned to start of next msg */
  339.  
  340.     if(!*xmsg->to && !*xmsg->from && !*xmsg->subj) {
  341.         return -3;
  342.     }
  343.     len = strlen(*text);
  344.     if(!len) {
  345.         return -3;
  346.     }
  347.  
  348.     if(strlen(xmsg->date) < 19) {
  349.         for(x = 0; x < 19;x++) if(!xmsg->date[x]) xmsg->date[x] = 'Q';
  350.     }
  351.  
  352.     /* end grunged msg testing */
  353.  
  354.     p = *text;
  355.     while (*p) {    /* Strip linefeeds and soft cr's FAST */
  356.         if(*p == '\x8d' || *p == '\n') {
  357.             memmove(p,&p[1],len - (unsigned int)((long)p - (long)*text));
  358.             len--;
  359.             if(!len) break;
  360.             continue;
  361.         }
  362.         p++;
  363.     }
  364.  
  365.     if(!strnicmp(*text,"AREA:",5)) { /* Echo area tag */
  366.         area = *text;
  367.         while(**text && **text != '\r') {
  368.             (*text)++;
  369.         }
  370.         if(**text) {
  371.             **text = 0;                  /* area now = area tag line */
  372.             (*text)++;                     /* text = true start of msg body if any */
  373.         }
  374.         while(**text == '\r' && **text) (*text)++; /* Skip leading cr's in body */
  375.         area += 5;
  376.         lstrip(area);
  377.         rstrip(area);                    /* Points directly to tag */
  378.     }
  379.     else area = NULL;
  380.  
  381.     if (area) {             /* Do ECHO specific BS */
  382.  
  383.         origin = pathline = seenby = NULL;
  384.  
  385.         tempo = *text;     /* They oughta outlaw EID's */
  386.         while ((tempo = bmgStrstr("\01EID:",tempo,0)) != NULL)
  387.           memmove(tempo,strchr(&tempo[1],'\r'),strlen(strchr(&tempo[1],'\r'))+1);
  388.  
  389.         tempo = *text;     /* and VIA's */
  390.         while ((tempo = bmgStrstr("\01VIA",tempo,1)) != NULL)
  391.           memmove(tempo,strchr(&tempo[1],'\r'),strlen(strchr(&tempo[1],'\r'))+1);
  392.  
  393.         while(**text == '\r' && **text) (*text)++; /* Skip leading cr's in body */
  394.         if(!strncmp(*text," * Origin: ",11)) **text = 0;
  395.         origin = bmgStrstr("\r * Origin:",*text,0);  /* find origin line */
  396.         if (origin) {       /* Ain't one; oh, well, screw it */
  397.             while((tempo = bmgStrstr("\r * Origin:",&origin[1],0)) != NULL)
  398.               origin = tempo; /* Find last */
  399.             pathline = bmgStrstr("\r\01PATH:",origin,0);   /* Find the PATH line */
  400.             seenby = bmgStrstr("\rSEEN-BY:",origin,0); /* Find start of SEEN-BYs */
  401.             if(pathline && seenby && pathline > seenby) {
  402.                 memmove(seenby,pathline,strlen(pathline) + 1);
  403.             }
  404.             else if(seenby) *seenby = 0;
  405.         }
  406.     }
  407.  
  408.     xmsg->length = strlen(*text);
  409.     xmsg->m_attr = 0;
  410.     if(area) xmsg->m_attr |= MSGECHO;        /* Is echo */
  411.     else xmsg->m_attr |= MSGNET;             /* Is net  */
  412.  
  413.     return 0;
  414. }
  415.